/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vue;

import controlleur.ControleurDeJeu;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import model.PartieCarteObservateur;

/**
 *
 *
 * Classe qui affiche le terrain avec les emplacement de carte les corbeilles et
 * les deck, c'est cette classe qui va dire au Carte_Vue où se placer le
 * principe est le même que Main_Vue, on crée des point qu'on associe à des
 * Carte_Vue J'ai mis un BorderLayout sur ce JPanel : au nord on a les stats du
 * joueur 2 au centre on a le terrain qui est un GridLayout au sud on a les
 * stats du joueur 1
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public class Terrain_vue extends JPanel implements PartieCarteObservateur {

  private ControleurDeJeu cdj;
  private Point[] positions;
  private HashMap<Carte_vue, Point> listeCarte;
  private JPanel field;
  private JPanel jPanel;
  private JPanel iaPanel;
  private JLabel jLabel;
  private JLabel iaLabel;
  private JButton iaButton;
  private java.applet.AudioClip son;

  /**
   *
   * @param cdj
   */
  public Terrain_vue(ControleurDeJeu cdj) {
    this.cdj = cdj;
    this.setFocusable(true);
    this.field = new JPanel();
    this.listeCarte = new HashMap<>();
    this.jLabel = new JLabel();
    this.iaLabel = new JLabel();
    this.jPanel = new JPanel();
    this.iaPanel = new JPanel();
    this.positions = new Point[24];
    this.positions[0] = new Point(1, 0);
    int k = 1;
    for (int i = 0; i < 4; i++) {
      for (int j = 0; i < 6; i++) {
        this.positions[k] = new Point(this.positions[k - 1].x + 107, this.positions[k - 1].y);
        k++;
      }
      this.positions[k] = new Point(0, this.positions[k - 1].y + 159);
      k++;
    }

    this.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        HashMap<Carte_vue, Point> listeDeCarte = new HashMap<>();
        listeDeCarte.putAll(Terrain_vue.this.listeCarte);
        for (Carte_vue c : listeDeCarte.keySet()) {
          if (c.isInside(e.getX(), e.getY())) {
            Terrain_vue.this.cdj.getJoueur().getMain().deselectionner();
            if (c.getType().equals("deck") && listeDeCarte.get(c) == positions[23]) {
              Terrain_vue.this.cdj.piocher();
              break;
            } else if (c.getType().equals("carte")) {
              Terrain_vue.this.cdj.selection(c.getCarte());
              Terrain_vue.this.cdj.addMessage("Carte Séléctionnée du terrain : " + c.getCarte().getNom());
              if (Terrain_vue.this.cdj.getAttaqueMode()) {
                if (Terrain_vue.this.cdj.attaquerPhase2()) {
                  jouerSon();
                  Terrain_vue.this.cdj.notifierObs();
                }
              }

              break;
            }
//            Terrain_vue.this.cdj.notifierObs(); //Nécéssaire ? vu qu'actualiser est appelée après
//            System.out.println("carte = " + c + "  point=" + listeDeCarte.get(c));
          }

        }
//
//        listeDeCarte.clear();
//
//        if (e.getX() >= iaLabel.getX() && e.getX() <= iaLabel.getX() + iaLabel.getWidth() && e.getY() >= iaLabel.getY() && e.getY() <= iaLabel.getY() + iaLabel.getHeight()) {
//          Terrain_vue.this.cdj.addMessage("insiding");
//        }
      }
    });
    this.actualiser();

  }

  @Override
  public void actualiser() {
    this.listeCarte = new HashMap<>();
    this.removeAll();
    this.field.removeAll();
    this.jPanel.removeAll();
    this.iaPanel.removeAll();
    this.setVisible(false);
    this.setVisible(true);
    this.setLayout(new BorderLayout());

    //Création des JLabel
    this.jLabel = new JLabel("Joueur || Point de Vie = " + this.cdj.getJoueur().getVie() + " || Ressource = " + this.cdj.getJoueur().getRessourceTemp() + " || Nombre de carte dans la main = " + this.cdj.getJoueur().getMain().getMain().size());
    this.iaLabel = new JLabel("IA || Point de Vie = " + this.cdj.getIA().getVie() + " || Ressource = " + this.cdj.getIA().getRessourceTemp() + " || Nombre de carte dans la main = " + this.cdj.getIA().getMain().getMain().size());

    this.field.setLayout(new GridLayout(4, 12));
    int j = 0;
    for (int i = 0; i < 12; i++) {
      Carte_vue c;
      Point p;
      if (i == 5) {
        // On positionne le deck
        p = this.positions[i];
        c = new Carte_vue(0, 0, "deck", cdj.getIA().getDeck());
        j = 0;
      } else if (i == 11) {
        // On positionne la corbeille
        p = this.positions[i];
        c = new Carte_vue(0, 0, "corbeille", cdj.getIA().getCorbeille());
        j = 0;
      } else {
        // On positionne les emplacements de carte vide, les cartes offensive, les cartes defensive
        p = this.positions[i];
        if (i < 5) {
          if (cdj.getIA().getPartieTerrain().caseDejaPriseDef(j)) {
            c = new Carte_vue(0, 0, cdj.getIA().getPartieTerrain().getCarteDefensive(j));
          } else {
            c = new Carte_vue(0, 0);
          }
        } else {
          if (cdj.getIA().getPartieTerrain().caseDejaPriseOff(j)) {
            c = new Carte_vue(0, 0, cdj.getIA().getPartieTerrain().getCarteOffensive(j));
          } else {
            c = new Carte_vue(0, 0);
          }
        }
        j++;
      }
      //On répertorie les cartes vue dans une hashmap
      this.listeCarte.put(c, p);
      this.field.add(c);
    }
    j = 0;
    for (int i = 12; i < 24; i++) {
      Carte_vue c;
      Point p;
      if (i == 23) {
        // On positionne le deck
        p = this.positions[i];
        c = new Carte_vue(0, 0, "deck", cdj.getJoueur().getDeck());
        j = 0;
        //this.position=new Point(c.getX(), c.getY());
      } else if (i == 17) {
        // On positionne la corbeille
        p = this.positions[i];
        c = new Carte_vue(0, 0, "corbeille", cdj.getJoueur().getCorbeille());
        j = 0;
      } else {
        // On positionne les emplacements de carte vide, les cartes offensive, les cartes defensive
        p = this.positions[i];
        if (i < 17) {
          if (cdj.getJoueur().getPartieTerrain().caseDejaPriseOff(j)) {
            c = new Carte_vue(0, 0, cdj.getJoueur().getPartieTerrain().getCarteOffensive(j));
          } else {
            c = new Carte_vue(0, 0);
          }
        } else {
          if (cdj.getJoueur().getPartieTerrain().caseDejaPriseDef(j)) {
            c = new Carte_vue(0, 0, cdj.getJoueur().getPartieTerrain().getCarteDefensive(j));
          } else {
            c = new Carte_vue(0, 0);
          }
        }
        j++;
      }
      //On répertorie les cartes vue dans une hashmap
      this.listeCarte.put(c, p);
      this.field.add(c);

    }

    System.out.println("ACTUALISATION TERRAIN");
    iaButton = new JButton("PV IA");
//    System.out.println("defense ia : "+this.cdj.getIA().getPartieTerrain().nbDefense());
    if (this.cdj.getIA().getPartieTerrain().nbDefense() == 0) {
      iaButton.setEnabled(true);
    } else {
      iaButton.setEnabled(false);
    }
    iaButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae) {
//        System.out.println("ATTAQUE PV");
        if (Terrain_vue.this.cdj.getAttaqueMode()) {
//          System.out.println("ATTAQUE PV CONDITION");
          Terrain_vue.this.cdj.attaquerPV();
          Terrain_vue.this.jouerSon();
        }
        Terrain_vue.this.cdj.notifierObs();
      }
    });

    this.jPanel.add(this.jLabel);
    this.iaPanel.add(this.iaLabel);
    this.iaPanel.add(this.iaButton);
    //On positionne les JLabel et le terrain
    this.add(this.field, BorderLayout.CENTER);
    this.add(this.jPanel, BorderLayout.SOUTH);
    this.add(this.iaPanel, BorderLayout.NORTH);
    this.field.setBackground(Color.white);

    //Style des JLabel
    this.jLabel.setOpaque(true);
    this.jLabel.setForeground(Color.green);
    this.jLabel.setBackground(Color.black);
    this.jLabel.setFont(new Font("Courier new", Font.PLAIN, 12));

    this.iaLabel.setOpaque(true);
    this.iaLabel.setForeground(Color.green);
    this.iaLabel.setBackground(Color.black);
    this.iaLabel.setFont(new Font("Courier new", Font.PLAIN, 12));

    //Changement du curseur de la souris en cas d'attaque
    if (Terrain_vue.this.cdj.getAttaqueMode()) {
      Toolkit tk = Toolkit.getDefaultToolkit();
      Image img = tk.createImage("./Sprite/curseur_atk.GIF");
      Cursor monCurseur = tk.createCustomCursor(img, new Point(16, 16), "épée");
      setCursor(monCurseur);
    } else {
      setCursor(Cursor.getDefaultCursor());
    }

  }

  /**
   *
   */
  public void jouerSon() {
    java.net.URL url = Board.class.getResource("Musique/attaque.wav");
    son = java.applet.Applet.newAudioClip(url);
    son.play();
  }
}
